#include "widget.h"
#include <QPushButton>

//下课后，老师发送 饿了信号  学生接受信号 请客吃饭
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //创建老师对象，指定其父亲，放到对象树上
    tc=new Teacher(this);
    //创建学生对象
    st=new Student(this);

//    //建立连接
//    connect(tc,&Teacher::hungry,st,&Student::treat);

//    //触发事件
//    classIsOver();

//    重载版本(带参数)
    //建立连接
    //为避免 二义性，采用函数指针的方式
//    void (Teacher:: *teacherSignal)(QString)=&Teacher::hungry;
//    void (Student:: *studentSlot)(QString)=&Student::treat;

//    using T = void (Teacher:: *)(QString);
//    T teacherSignal=&Teacher::hungry;
//    using S = void (Student:: *)(QString);
//    S studentSlot=&Student::treat;
    //连接
//    connect(tc,teacherSignal,st,studentSlot);

    //手动触发事件
//    classIsOver();

/******************************************************************/
    //1：按钮触发下课，再引起老师饿了的信号
    void (Teacher:: *teacherSignal)(QString)=&Teacher::hungry;
    void (Student:: *studentSlot)(QString)=&Student::treat;
    connect(tc,teacherSignal,st,studentSlot);
    //点击下课按钮，触发下课
    QPushButton* btn=new QPushButton("下课",this);
    //重置窗口大小
    this->resize(600,400);

    //点击按钮，触发下课【信号连接槽】
//    connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

    //1.2：无参信号和槽连接
    void (Teacher:: *teacherSignal2)(void)=&Teacher::hungry;
    void (Student:: *studentSlot2)(void)=&Student::treat;
//    connect(tc,teacherSignal2,st,studentSlot2);

    //1.3：信号连接信号：按下按钮直接触发teacher::hungry信号，不需要调用classIsOver去触发
    connect(btn,&QPushButton::clicked,tc,teacherSignal2);

    //断开连接
    //disconnect(tc,teacherSignal2,st,studentSlot2)

//    1. 信号是可以连接信号
//    2. 一个信号可以连接多个槽函数
//    3. 多个信号可以连接同一个糟函数
//    4. 信号和槽函数的参数必须类型―—对应
//    5. 信号和槽的参数个数︰信号的参数个数可以多余槽函数的参数个数，但是信号的参数需要和槽函数参数一一对应

//    QT4版本连接方案
    //直观
    //没有类型检测
//    connect(tc,SIGNAL(hungry()),st,SLOT(treat()));



    //2：利用lambda表达式，实现点击按钮关闭窗口
    QPushButton* btnL=new QPushButton("关闭",this);
    btnL->move(100,0);
    connect(btnL,&QPushButton::clicked,[=](){
//        this->close();
//        emit tc->hungry("宫保鸡丁");
        btnL->setText("打开");
    });
}

void Widget::classIsOver()
{
    //emit 触发信号
    //emit tc->hungry();

    emit tc->hungry("螺蛳粉");
}


Widget::~Widget()
{

}


